import pandas as pd
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.express as px
import plotly.graph_objects as go
C:\Users\mehdi\AppData\Local\Temp\ipykernel_25544\4051237116.py:3: UserWarning: 
The dash_core_components package is deprecated. Please replace
`import dash_core_components as dcc` with `from dash import dcc`
  import dash_core_components as dcc
C:\Users\mehdi\AppData\Local\Temp\ipykernel_25544\4051237116.py:4: UserWarning: 
The dash_html_components package is deprecated. Please replace
`import dash_html_components as html` with `from dash import html`
  import dash_html_components as html

Research and Development#

Research and development (R&D) are crucial for driving innovation, creating high-quality jobs, and building a sustainable, low-carbon economy. Recognizing this, the provincial government has developed the StrongerBC plan, which sets out a vision for strengthening R&D in B.C.

df1 = pd.read_csv("~/strongerbc/data/research_and_development_1.csv")
df = df1[df1['Year'] >= 2000]
fig = px.line(df1, x= 'Year', y = 'VALUE')
fig.show(render='notebook')
df1 = pd.read_csv("~/strongerbc/data/research_and_development_1.csv")
df = df1[df1['Year'] >= 2000]
app = dash.Dash(__name__)

# Labels and Steps of Year Range
labels = {str(year): str(year) for year in range(df['Year'].min(), df['Year'].max() + 1 , 5)}
steps = {str(year): '' for year in range(df['Year'].min(), df['Year'].max() + 1)}
marks = {**steps, **labels}


app.layout = html.Div([
    html.Div([
        dcc.Graph(id='value-graph')
    ], style={'width': '100%', 'display': 'inline-block'}),
    html.Div([
        dcc.RangeSlider(
            id='year-slider',
            min=df['Year'].min(),
            max=df['Year'].max(),
            value=[df['Year'].min(), df['Year'].max()],
            marks=marks,
            step=None
        ),
        dcc.Dropdown(
            id='geo-dropdown',
            options=[{'label': i, 'value': i} for i in df['GEO'].unique()],
            value=df['GEO'].unique()[0]
        ),
        dcc.Dropdown(
            id='Funder-dropdown',
            options=[{'label': i, 'value': i} for i in df['Funder'].unique()],
            value=df['Funder'].unique()[0]
        ),
        dcc.Dropdown(
            id='Performer-dropdown',
            options=[{'label': i, 'value': i} for i in df['Performer'].unique()],
            value=df['Performer'].unique()[0]
        ),
        dcc.Dropdown(
            id='ScienceType-dropdown',
            options=[{'label': i, 'value': i} for i in df['Science type'].unique()],
            value=df['Science type'].unique()[0]
        ),
        dcc.Dropdown(
            id='Prices-dropdown',
            options=[{'label': i, 'value': i} for i in df['Prices'].unique()],
            value=df['Prices'].unique()[0]
        )
    ], style={'width': '100%', 'display': 'inline-block'}),
])

@app.callback(
    Output('value-graph', 'figure'),
    [Input('year-slider', 'value'),
     Input('geo-dropdown', 'value'),
     Input('Funder-dropdown', 'value'),
     Input('Performer-dropdown', 'value'),
     Input('ScienceType-dropdown', 'value'),
     Input('Prices-dropdown', 'value')],
)
def update_graph(year_range, geo_value, Funder_value, Performer_value, ScienceType_value, Prices_value):
    dff = df[(df['Year'] >= year_range[0]) & 
             (df['Year'] <= year_range[1]) & 
             (df['GEO'] == geo_value)      & 
             (df['Funder'] == Funder_value)&
             (df['Performer'] == Performer_value) &
             (df['Science type'] == ScienceType_value) &
             (df['Prices'] == Prices_value)]

    fig = px.line(dff, x="Year", y="VALUE", title='Investment in Innovation', template='plotly_white')
    fig.update_traces(mode='markers+lines')
    fig.update_yaxes(title_text=f'{Prices_value} (in millions $ )')
    fig.update_layout(
    title={
        'text': "Trends in Innovation Investment",
        'y':0.9,
        'x':0.5,
        'xanchor': 'center',
        'yanchor': 'top'})

    return fig

if __name__ == '__main__':
    app.run_server(debug=True)
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
Cell In[3], line 84
     81     return fig
     83 if __name__ == '__main__':
---> 84     app.run_server(debug=True)

File ~\miniconda3\lib\site-packages\dash\dash.py:2175, in Dash.run_server(self, *args, **kwargs)
   2169 def run_server(self, *args, **kwargs):
   2170     """`run_server` is a deprecated alias of `run` and may be removed in a
   2171     future version. We recommend using `app.run` instead.
   2172 
   2173     See `app.run` for usage information.
   2174     """
-> 2175     self.run(*args, **kwargs)

File ~\miniconda3\lib\site-packages\dash\dash.py:2066, in Dash.run(self, host, port, proxy, debug, jupyter_mode, jupyter_width, jupyter_height, jupyter_server_url, dev_tools_ui, dev_tools_props_check, dev_tools_serve_dev_bundles, dev_tools_hot_reload, dev_tools_hot_reload_interval, dev_tools_hot_reload_watch_interval, dev_tools_hot_reload_max_retry, dev_tools_silence_routes_logging, dev_tools_prune_errors, **flask_run_options)
   2063             extra_files.append(path)
   2065 if jupyter_dash.active:
-> 2066     jupyter_dash.run_app(
   2067         self,
   2068         mode=jupyter_mode,
   2069         width=jupyter_width,
   2070         height=jupyter_height,
   2071         host=host,
   2072         port=port,
   2073         server_url=jupyter_server_url,
   2074     )
   2075 else:
   2076     self.server.run(host=host, port=port, debug=debug, **flask_run_options)

File ~\miniconda3\lib\site-packages\dash\_jupyter.py:401, in JupyterDash.run_app(self, app, mode, width, height, host, port, server_url)
    399     display(HTML(msg))
    400 else:
--> 401     raise final_error

File ~\miniconda3\lib\site-packages\dash\_jupyter.py:388, in JupyterDash.run_app(self, app, mode, width, height, host, port, server_url)
    385         raise err
    387 try:
--> 388     wait_for_app()
    390     if self.in_colab:
    391         JupyterDash._display_in_colab(dashboard_url, port, mode, width, height)

File ~\miniconda3\lib\site-packages\retrying.py:56, in retry.<locals>.wrap.<locals>.wrapped_f(*args, **kw)
     54 @six.wraps(f)
     55 def wrapped_f(*args, **kw):
---> 56     return Retrying(*dargs, **dkw).call(f, *args, **kw)

File ~\miniconda3\lib\site-packages\retrying.py:266, in Retrying.call(self, fn, *args, **kwargs)
    263 if self.stop(attempt_number, delay_since_first_attempt_ms):
    264     if not self._wrap_exception and attempt.has_exception:
    265         # get() on an attempt with an exception should cause it to be raised, but raise just in case
--> 266         raise attempt.get()
    267     else:
    268         raise RetryError(attempt)

File ~\miniconda3\lib\site-packages\retrying.py:301, in Attempt.get(self, wrap_exception)
    299         raise RetryError(self)
    300     else:
--> 301         six.reraise(self.value[0], self.value[1], self.value[2])
    302 else:
    303     return self.value

File ~\miniconda3\lib\site-packages\six.py:719, in reraise(tp, value, tb)
    717     if value.__traceback__ is not tb:
    718         raise value.with_traceback(tb)
--> 719     raise value
    720 finally:
    721     value = None

File ~\miniconda3\lib\site-packages\retrying.py:251, in Retrying.call(self, fn, *args, **kwargs)
    248     self._before_attempts(attempt_number)
    250 try:
--> 251     attempt = Attempt(fn(*args, **kwargs), attempt_number, False)
    252 except:
    253     tb = sys.exc_info()

File ~\miniconda3\lib\site-packages\dash\_jupyter.py:379, in JupyterDash.run_app.<locals>.wait_for_app()
    377     if res != "Alive":
    378         url = f"http://{host}:{port}"
--> 379         raise OSError(
    380             f"Address '{url}' already in use.\n"
    381             "    Try passing a different port to run_server."
    382         )
    383 except requests.ConnectionError as err:
    384     _get_error()

OSError: Address 'http://127.0.0.1:8050' already in use.
    Try passing a different port to run_server.